# python利用内存中一段连续空间存储列表
# 1.创建列表
# 列表元素可以是整型,浮点型,字符串等基本类型,也可以是列表,元组,字典等组合类型。
# 列表中元素类型可以相同也可以不同,元素之间使用,分割
# ①使用[]创建列表
list_one = [1, "1", True, [1, 2, 'a', 'b']]
print(list_one)  # [1, '1', True, [1, 2, 'a', 'b']]
# ②使用list()函数创建列表
# list()函数接收一个可迭代类型的数据，返回一个列表。
list_two = list("python")
list_three = list(['hello', 'world'])
print(list_two)  # ['p', 'y', 't', 'h', 'o', 'n']
print(list_three)  # ['hello', 'world']

# 2.访问列表元素
# ①以索引方式访问列表元素
# 语法:list[n]  访问索引为n的元素 下标取值范围[-len,len-1]
# Python支持双向索引,正向索引从0开始,自左向右依次递增;反向索引从-1开始,自右向左依次递减
print(list_two[2])  # t 正向索引
print(list_two[-4])  # t 负向索引
# ②以切片方式访问列表元素
# 语法:list[m:n:step]  返回一个新的列表
# 按步长step获取列表[m,n)对应的元素 step默认为1 m,n可省略默认从头到尾
print(list_two[1:5:2])  # ['y', 'h']
print(list_two[1:5])  # ['y', 't', 'h', 'o']
print(list_two[::2])  # ['y', 'h', 'n']
# ③在循环中依次访问列表元素
# 列表为一个可迭代对象,可以使用for...in...进行遍历
for i in list_two:
    print(i, end=" ")  # p y t h o n
print()  # 换行

# 3.添加列表元素
# ①append()方法    在列表尾部添加新的元素(无返回值)
list1 = [1, 2, 3, 4]
list1.append('5')
print(list1)  # [1, 2, 3, 4, '5']
# ②extend(iterable)方法    在列表末尾依次性添加另一个可迭代对象中的所有元素(无返回值)
list2 = "python"
list3 = ['a', 'b', 'c']
list1.extend(list2)
list1.extend(list3)
print(list1)  # [1, 2, 3, 4, '5', 'p', 'y', 't', 'h', 'o', 'n', 'a', 'b', 'c']
# ③insert(index,object)方法   在指定位置插入元素,index及后面元素向后移动(无返回值)
list3.insert(1, 'd')
print(list3)  # ['a', 'd', 'b', 'c']

# 4.元素排序
# ①sort()方法 按特定序列对列表元素排序 (无返回值)
# 语法:sort(key=None,reverse=False)
# key:指定排序规则 reverse=False:升序排列(默认) reverse=True:降序排列
list1 = [5, 4, 1, 2, 9]
list1.sort()  # 升序排列
print(list1)  # [1, 2, 4, 5, 9]
list1.sort(reverse=True)  # 降序排列
print(list1)  # [9, 5, 4, 2, 1]
list2 = ["python", "web", "java", "c#"]
list2.sort(key=len)  # 按照字符串的长度升序排列
print(list2)  # ['c#', 'web', 'java', 'python']
# ②sorted(list)方法   按照升序排列返回排列后的新列表 (有返回值)
list1 = sorted([2, 4, 9, 0])
print(list1)  # [0, 2, 4, 9]
# ③reverse()方法  倒置数组 (无返回值)
list1 = [1, 2, 3, 4, 5, 6]
list1.reverse()
print(list1)  # [6, 5, 4, 3, 2, 1]

# 5删除列表元素
# ①del语句    删除列表中指定位置的元素 (无返回值)
# 语法:del 列表名[index]
list1 = ["python", "web", "java", "c#"]
del list1[2]
print(list1)  # ['python', 'web', 'c#']
# 删除整个列表
del list1
# ②remove()方法 (无返回值)
# 语法: list.remove(object)
list1 = ["python", "web", "java", "c#"]
list1.remove("c#")
print(list1)  # ['python', 'web', 'java']
# ③pop()方法
# 语法:pop(index) 移除列表中指定下标的元素,未指定默认为最后一个元素(返回被移除的元素)
list1 = ["python", "web", "java", "c#"]
print(list1.pop(2))  # java # 删除指定下标元素
print(list1)  # ['python', 'web', 'c#']
list1.pop()  # 删除最后一个元素
print(list1)  # ['python', 'web']
# ④clear()方法
# 语法:list.clear()   清空整个列表
list1.clear()
print(list1)  # []

# 6.求指定元素在列表中的下标
# index()方法 返回指定元素在列表中第一次出现的下标
# 语法:list.index(object)
list1 = ["python", "web", "java", "c#"]
print(list1.index("java"))

# 7.列表推导式
# 语法:[表达式 for 迭代变量 in 可迭代对象]    用于生成列表
# 可迭代对象:可以通过for...in...遍历(字符串,列表,元组,集合,字典(keys(),values(),items()))
# 将列表中的每个元素求平方
list1 = [1, 2, 3, 4]
list1 = [data * data for data in list1]
print(list1)  # [1, 4, 9, 16]
# ①带有if语句的列表推导式
# 将列表中是3的倍数的元素生成一个新的列表并求其平方
list1 = [1, 3, 6, 2, 4, 7]
list1 = [pow(data, 2) for data in list1 if data % 3 == 0]
print(list1)  # [9, 36]
# ②嵌套for循环语句的列表推导式
# 列表1和列表2中的元素的和作为列表3的元素
ls1 = [1, 2, 3]
ls2 = [6, 7, 8]
ls3 = [i + j for i in ls1 for j in ls2]  # 从左到右依次为外层循环和内层循环
print(ls3)  # [7, 8, 9, 8, 9, 10, 9, 10, 11]
# 上面代码等价于
list3 = []
for i in ls1:
    for j in ls2:
        list3.append(i + j)
print(list3)  # [7, 8, 9, 8, 9, 10, 9, 10, 11]
# ③带有if语句和嵌套for循环语句的列表推导式
# 由于该写法较为复杂且层次关系不鲜明不建议使用
